iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
Kubernetes

從零開始的 Kubernetes 基礎觀念與實作系列 第 26 篇

從零開始的 Kubernetes 基礎觀念與實作 DAY26

  • 分享至 

  • xImage
  •  

ResourceQuota 與 LimitRange:Namespace 資源限制

前面的文章已經介紹過如何使用 resources.requests 和 resources.limits 設定容器的資源需求,也透過 Metrics Server 觀察 Pod 與 Node 的資源使用情況。

但當 Kubernetes Cluster 同時執行多個應用程式時,如果沒有適當限制,某個 Namespace 可能建立過多 Pod,或配置過多 CPU、Memory 資源,進而影響其他應用程式。

Kubernetes 提供 ResourceQuota 和 LimitRange,讓管理者能夠限制 Namespace 的資源配置。

ResourceQuota

ResourceQuota 用來限制整個 Namespace 可以使用的資源總量。

例如,可以限制:

  • Namespace 最多建立多少個 Pod。
  • 所有容器的 CPU requests 總量。
  • 所有容器的 Memory requests 總量。
  • 所有容器的 CPU、Memory limits 總量。

首先建立一個測試用 Namespace:

kubectl create namespace quota-demo

接著建立 resourcequota.yaml:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: demo-quota
  namespace: quota-demo
spec:
  hard:
    pods: "3"
    requests.cpu: "500m"
    requests.memory: "512Mi"
    limits.cpu: "1"
    limits.memory: "1Gi"

這份 YAML 表示:

  • 最多允許 3 個 Pod。
  • CPU requests 總量不能超過 500m。
  • Memory requests 總量不能超過 512Mi。
  • CPU limits 總量不能超過 1 Core。
  • Memory limits 總量不能超過 1Gi。

套用設定:

kubectl apply -f resourcequota.yaml

查看 ResourceQuota:

kubectl describe resourcequota demo-quota -n quota-demo

可以看到 Used 與 Hard 兩個欄位,分別代表目前已配置的資源與允許的上限。
image

LimitRange

ResourceQuota 限制的是整個 Namespace 的資源總量,而 LimitRange 可以針對 Namespace 中的個別容器設定預設資源值與允許範圍。

例如,當開發者建立容器時沒有指定 requests 和 limits,就可以透過 LimitRange 自動補上預設值。

建立 limitrange.yaml:

apiVersion: v1
kind: LimitRange
metadata:
  name: demo-limit
  namespace: quota-demo
spec:
  limits:
    - type: Container
      defaultRequest:
        cpu: 100m
        memory: 64Mi
      default:
        cpu: 200m
        memory: 128Mi
      min:
        cpu: 50m
        memory: 32Mi
      max:
        cpu: 500m
        memory: 512Mi

這裡設定了:

  • defaultRequest:容器未指定 requests 時使用的預設值。
  • default:容器未指定 limits 時使用的預設值。
  • min:容器允許的最小資源設定。
  • max:容器允許的最大資源設定。

套用設定:

kubectl apply -f limitrange.yaml

實際測試

建立 quota-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: quota-test
  namespace: quota-demo
spec:
  containers:
    - name: nginx
      image: nginx:stable

這份 YAML 沒有指定 CPU 和 Memory 的 requests、limits。

建立 Pod:

kubectl apply -f quota-pod.yaml

查看 Pod:

kubectl describe pod quota-test -n quota-demo

在容器的資源設定中,應該可以看到 LimitRange 自動補上的預設值:

image

接著查看 ResourceQuota:

kubectl describe resourcequota demo-quota -n quota-demo

此時 ResourceQuota 的 Used 應該會增加,因為剛剛建立的 Pod 已經配置了資源。

可以繼續建立更多 Pod,觀察當資源配置超過 ResourceQuota 的限制時,Kubernetes 如何拒絕建立新的資源。

例如,嘗試將 Pod 數量增加到超過 3 個,就會以下的錯誤:

image

這是因為 ResourceQuota 會在建立資源時檢查是否超過 Namespace 的限制。

需要注意的是,ResourceQuota 主要限制資源的配置額度,而不是直接測量或限制整個 Namespace 的即時 CPU、Memory 使用量。

ResourceQuota 與 LimitRange 的差異

比較 ResourceQuota LimitRange
限制範圍 整個 Namespace 個別容器或 Pod 等
主要用途 限制資源總額 限制單一資源的設定
預設 requests/limits 不提供 可以設定
限制 Pod 總數 可以 不負責
資源超出限制 拒絕建立或更新資源 拒絕不符合規則的資源

兩者可以同時使用,例如:

  • 使用 ResourceQuota 限制 Namespace 的資源總量。
  • 使用 LimitRange 避免個別容器配置過多資源,並提供合理的預設值。

總結

ResourceQuota 和 LimitRange 都是 Kubernetes 中管理資源的重要工具。

ResourceQuota 可以避免單一 Namespace 配置過多資源,而 LimitRange 可以規範個別容器的資源設定。

透過這兩個工具,管理者可以在同一個 Cluster 中,為不同 Namespace 建立適當的資源配置規則,減少應用程式之間互相影響的機會。


上一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY25
下一篇
# 從零開始的 Kubernetes 基礎觀念與實作 DAY27
系列文
從零開始的 Kubernetes 基礎觀念與實作 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言